package com.api.syh56.shengyunhui.util;

import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class CommonUtil {

    /**
     * 将对象的id字段设置为null。
     *
     * @param object 要修改的对象
     */
    public static void setIdToNull(Object object) {
        if (object != null) {
            try {
                // 反射设置对象的id属性为null
                java.lang.reflect.Field idField = object.getClass().getDeclaredField("id");
                if (idField != null) {
                    idField.setAccessible(true); // 如果字段是私有的，使其可以访问
                    idField.set(object, null);
                }
            } catch (NoSuchFieldException | IllegalAccessException e) {
                // 可以记录日志或处理异常
                e.printStackTrace();
            }
        }
    }

    /**
     * 判断任意一个字段是否为空。
     * @param fields
     * @return
     */
    public static boolean isAnyFieldEmpty(Object... fields) {
        for (Object field : fields) {
            if (field == null || (field instanceof String && ((String) field).isEmpty())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 将一组对象的id字段设置为null。
     *
     * @param objects 要修改的对象集合
     */
    public static void setIdsToNullInList(List<Object> objects) {
        if (!ObjectUtils.isEmpty(objects)) {
            for (Object obj : objects) {
                setIdToNull(obj);
            }
        }
    }


    /**
     * 从请求体中获取 Long 类型的值。
     * @param requestBody 请求体
     * @param key 键
     * @return Long 值，如果转换失败或值为 null，则返回 null。
     */
    public static Long getLongFromRequestBody(Map<String, String> requestBody, String key) {
        try {
            String value = requestBody.get(key);
            if (StringUtils.hasText(value)) {
                return Long.parseLong(value);
            }
        } catch (NumberFormatException e) {
            // 如果发生格式异常，可以在这里记录日志
            // log.error("转换错误: {}", e.getMessage());
        }
        return null; // 转换失败或值为 null 时返回 null
    }


    /**
     * 从字符集合“0123456789abcdefghijklmnopqrstuvwxyz”中随机生成size位字符串
     * @param size
     * @return String
     */
    public static String getRandomString(int size){
        //size位随机数
        String characters = "0123456789abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < size; i++) {
            int index = random.nextInt(characters.length());
            sb.append(characters.charAt(index));
        }
        return sb.toString();
    }


    public static String getRandomString(int size,String charactersSet){
        //size位随机数
        String characters = charactersSet;
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < size; i++) {
            int index = random.nextInt(characters.length());
            sb.append(characters.charAt(index));
        }
        return sb.toString();
    }

    public static BigDecimal limitAmount(BigDecimal initAmount){
        // 如果低于0.01，则取0.01
        BigDecimal minAmount = new BigDecimal("0.01");
        BigDecimal finalAmount = initAmount.compareTo(minAmount) < 0 ? minAmount : initAmount;
        return finalAmount;
    }

    /**
     * 计算5%平台服务费
     */
    public static BigDecimal getPlatformServiceFee(BigDecimal amount){


        //计算平台服务费5%
        BigDecimal fivePercent = amount.multiply(new BigDecimal("0.05"));
        // 向上取整
        BigDecimal roundedUp = fivePercent.setScale(2,BigDecimal.ROUND_UP);
        BigDecimal limitAmountRoundedUp = CommonUtil.limitAmount(roundedUp);
        return limitAmountRoundedUp;
    }

    /**
     * 地址经纬度保留7位小数
     */
    public static String getLocationWith7number(String location){

        String shipaddressLocation = location;
        // 创建DecimalFormat对象，设置保留七位小数
        DecimalFormat decimalFormat = new DecimalFormat("#.0000000");

        // 直接使用逗号分割字符串获取经纬度
        String[] coordinates = location.split(",");

        // 确保分割后的数组长度为2
        if (coordinates.length == 2) {
            // 格式化经度和纬度
            String formattedLongitude = decimalFormat.format(Double.parseDouble(coordinates[0]));
            String formattedLatitude = decimalFormat.format(Double.parseDouble(coordinates[1]));
            shipaddressLocation = formattedLongitude + "," + formattedLatitude;
        }

        return shipaddressLocation;
    }

}